package com.atlyn.utils;

import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.List;



public class Tool {
	//通用的增删改操作
			public int update(String sql,Object...args) {//sql中的占位符要与可变形参的长度一致
				Connection conn = null;
				PreparedStatement ps = null;
				try {
					//获取数据库的连接
					conn = JDBCUtils.getConnection();
					//预编译SQL语句
					ps = conn.prepareStatement(sql);
					//填充占位符
					for(int i = 0;i < args.length;i++) {
						ps.setObject(i+1, args[i]);//小心参数声明错误！
					}
					//执行
					/*
					 * ps.execute()
					 * 如果执行的是查询操作，有返回结果，则此方法返回true；
					 * 如果执行的是增删改操作，无返回值，返回false
					 */
					/*
					 * ps.executeUpdate()
					 * 是指执行修改了多少条，则返回一个int型值
					 */
					return ps.executeUpdate();
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}finally {
					//资源的关闭
				JDBCUtils.closeResource(conn, ps);
				
				}
				return 0;
			}
			/*
			 * 针对不同表的通用查询操作，并返回多条结果
			 */
			public <T> List<T> getForList(Class<T> clazz,String sql,Object...args){
				Connection conn = null;
				PreparedStatement ps = null;
				ResultSet rs = null;
				try {
					conn = JDBCUtils.getConnection();
					ps = conn.prepareStatement(sql);
					for(int i =0;i < args.length;i++) {
						ps.setObject(i + 1, args[i]);
					}
					rs = ps.executeQuery();
					//获取结果集的元数据
					ResultSetMetaData rsmd = rs.getMetaData();
					//通过ResultSetMetaData获取结果集中的列数
					int columnCount = rsmd.getColumnCount();
					//创建集合对象
					ArrayList<T> list = new ArrayList<T>();
					while(rs.next()) {
//						System.out.println(1);
						T t = clazz.newInstance();
						//处理结果集每一行数据中的每一个列
						for(int i = 0;i < columnCount;i++) {
							//获取列值
							Object columValue = rs.getObject(i + 1);
							
							//获取每个列的列名
							String columnLabel = rsmd.getColumnLabel(i + 1);
							//给t对象指定的columName属性，赋值为columValue,通过反射
							Field field = clazz.getDeclaredField(columnLabel);
							
//							System.out.println(t);
//							System.out.println("列名："+columnLabel);
//							System.out.println("field对象"+field);
//							System.out.println("columValue："+columValue);
//							System.out.println(columValue.getClass().toString());
							if(columValue instanceof BigDecimal) {
								long columValue1 = ((BigDecimal) columValue).longValue();
								field.setAccessible(true);
								field.set(t, columValue1);
							}else {
								field.setAccessible(true);
							field.set(t, columValue);
							}					
						}
						list.add(t);
					}
//					System.out.println(1);
					return list;
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}finally {
					JDBCUtils.closeResource(conn, ps, rs);
				}
				
				return null;
			}
			
			/*
			 * 针对于不同表的通用操作，返回表中的一条记录
			 */
			public <T> T getInstance(Class<T> clazz,String sql,Object...args) {
				Connection conn = null;
				PreparedStatement ps = null;
				ResultSet rs = null;
				try {
					conn = JDBCUtils.getConnection();
					ps = conn.prepareStatement(sql);
					for(int i =0;i < args.length;i++) {
						ps.setObject(i + 1, args[i]);
					}
					rs = ps.executeQuery();
					//获取结果集的元数据
					ResultSetMetaData rsmd = rs.getMetaData();
					//通过ResultSetMetaData获取结果集中的列数
					int columnCount = rsmd.getColumnCount();
					
					if(rs.next()) {
						T t = clazz.newInstance();
						//处理结果集每一行数据中的每一个列
						for(int i = 0;i < columnCount;i++) {
							//获取列值
							Object columValue = rs.getObject(i + 1);
							
							//获取每个列的列名
							String columnLabel = rsmd.getColumnLabel(i + 1);
							//给t对象指定的columName属性，赋值为columValue,通过反射
							Field field = clazz.getDeclaredField(columnLabel);
							field.setAccessible(true);
							field.set(t, columValue);
						}
						return t;
					}
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}finally {
					JDBCUtils.closeResource(conn, ps, rs);
				}
				
				return null;
			}

}
